package ar.uba.fi.taller2.ftrs.view;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

import com.sun.org.apache.xalan.internal.lib.NodeInfo;
import com.sun.xml.internal.txw2.Document;

import ar.uba.fi.taller2.ftrs.repo.Repositorio;
import ar.uba.fi.taller2.ftrs.repo.RepositoryManager;
import ar.uba.fi.taller2.ftrs.repo.Documento;

import java.net.URL;
import java.io.File;
import java.io.IOException;
import java.awt.Dimension;
import java.awt.GridLayout;

public class RepoTree extends JPanel
                      implements TreeSelectionListener {

	/*
	 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
	 *
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions
	 * are met:
	 *
	 *   - Redistributions of source code must retain the above copyright
	 *     notice, this list of conditions and the following disclaimer.
	 *
	 *   - Redistributions in binary form must reproduce the above copyright
	 *     notice, this list of conditions and the following disclaimer in the
	 *     documentation and/or other materials provided with the distribution.
	 *
	 *   - Neither the name of Sun Microsystems nor the names of its
	 *     contributors may be used to endorse or promote products derived
	 *     from this software without specific prior written permission.
	 *
	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
	 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
	 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
	 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
	 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
	 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
	 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
	 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
	 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
	 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */ 


	/**
	 * This application that requires the following additional files:
	 *   TreeDemoHelp.html
	 *    arnold.html
	 *    bloch.html
	 *    chan.html
	 *    jls.html
	 *    swingtutorial.html
	 *    tutorial.html
	 *    tutorialcont.html
	 *    vm.html
	 */


	
	    private JEditorPane htmlPane;
	    private JTree tree;
	    private static boolean DEBUG = false;

	    //Optionally play with line styles.  Possible values are
	    //"Angled" (the default), "Horizontal", and "None".
	    private static boolean playWithLineStyle = false;
	    private static String lineStyle = "Horizontal";
	    
	    //Optionally set the look and feel.
	    private static boolean useSystemLookAndFeel = false;
	    private static RepositoryManager rep;

	    public RepoTree(RepositoryManager r) {
	        super(new GridLayout(1,0));
	        rep = r;
	        //Create the nodes.
	        DefaultMutableTreeNode top =
	            new DefaultMutableTreeNode("Repositorios");
	        String[] listarep=rep.listRepositories();
	        createNodes(top);

	        //Create a tree that allows one selection at a time.
	        tree = new JTree(top);
	        tree.getSelectionModel().setSelectionMode
	                (TreeSelectionModel.SINGLE_TREE_SELECTION);

	        //Listen for when the selection changes.
	        tree.addTreeSelectionListener(this);

	        if (playWithLineStyle) {
	            System.out.println("line style = " + lineStyle);
	            tree.putClientProperty("JTree.lineStyle", lineStyle);
	        }

	        //Create the scroll pane and add the tree to it. 
	        JScrollPane treeView = new JScrollPane(tree);

	        //Create the HTML viewing pane.
	        htmlPane = new JEditorPane();
	        htmlPane.setEditable(false);
	        JScrollPane htmlView = new JScrollPane(htmlPane);

	        //Add the scroll panes to a split pane.
	        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
	        splitPane.setTopComponent(treeView);
	        splitPane.setBottomComponent(htmlView);

	        Dimension minimumSize = new Dimension(100, 50);
	        htmlView.setMinimumSize(minimumSize);
	        treeView.setMinimumSize(minimumSize);
	        splitPane.setDividerLocation(100); 
	        splitPane.setPreferredSize(new Dimension(500, 300));

	        //Add the split pane to this panel.
	        add(splitPane);
	    }

	   
	      
	    
	    /** Required by TreeSelectionListener interface. */
	    public void valueChanged(TreeSelectionEvent e) {
	        DefaultMutableTreeNode node = (DefaultMutableTreeNode)
	                           tree.getLastSelectedPathComponent();

	        if (node == null) return;	        
	        Object nodeInfo = node.getUserObject();
	        
	        try{
	        if (node.isLeaf()) {
	        	if(nodeInfo.getClass().getSimpleName().equals("Documento"))
	        		displayURL(new URL("file:"+((Documento)nodeInfo).getPath()));
	            
	        } 
	        }catch(Exception ex){
	        	ex.printStackTrace();
	        }
	        if (DEBUG) {
	            System.out.println(nodeInfo.toString());
	        }
	    }

	
	    private void displayURL(URL url) {
	        try {
	            if (url != null) {
	                htmlPane.setPage(url);
	            } else { //null url
			htmlPane.setText("File Not Found");
	                if (DEBUG) {
	                    System.out.println("Attempted to display a null URL.");
	                }
	            }
	        } catch (IOException e) {
	            System.err.println("Attempted to read a bad URL: " + url);
	        }
	    }

	   private void createNodes(DefaultMutableTreeNode top) {	        
	        if ( top != null){	
	        String[] listarep = this.rep.listRepositories();
			for (int i=0; i < listarep.length;i++)
			    {
		        	Repositorio rep = new Repositorio(listarep[i]);
		        	DefaultMutableTreeNode repoNode = new DefaultMutableTreeNode(rep);
		        	top.add(repoNode);
		        	createNodes(repoNode,Repositorio.getContentFullPath(rep.getPath())); 			        	
			        }
	        }
	    }
	        
	    private void createNodes(DefaultMutableTreeNode top,String[] list) {
	    	if (list.length>0){
	    		String baseDir = Repositorio.pathToBasedir(list[0]);	    	
		    	for (int i=0; i < list.length;i++)
			    {
	    		File f = new File(list[i]);		    		
		    		if (f.isDirectory()){
		    			
			    		DefaultMutableTreeNode dirNode = new DefaultMutableTreeNode(Repositorio.pathToName(list[i]));
			    		top.add(dirNode);
		    			String [] lista = f.list();
		    			for (int j=0;j<lista.length;j++)
		    				lista[j]=baseDir+lista[j];
		    			createNodes( dirNode, lista );		    			
		    		}else{		    			
			    		DefaultMutableTreeNode dirNode = new DefaultMutableTreeNode(new Documento(list[i]));
			    		top.add(dirNode);
		    		}
			    }
	    	}
	    }
	

	

	
}
